#define _CRT_SECURE_NO_WARNINGS

//typedef int STDataType;
//
//typedef struct stack
//{
//	STDataType* a;
//	int capacity;
//	int top;
//}ST;
//
//void STInit(ST* ps)
//{
//	assert(ps);
//	ps->a = NULL;
//	ps->capacity = 0;
//	ps->top = 0;
//}
//
//void STPush(ST* ps, STDataType x)
//{
//	if (ps->capacity == ps->top)
//	{
//		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
//		if (tmp == NULL)
//		{
//			perror("realloc");
//			return;
//		}
//		ps->capacity = newcapacity;
//		ps->a = tmp;
//	}
//	ps->a[ps->top++] = x;
//}
//
//bool STEmpty(ST* ps)
//{
//	assert(ps);
//	return ps->top == 0;
//}
//
//void STPop(ST* ps)
//{
//	assert(ps);
//	assert(!STEmpty(ps));
//	ps->top--;
//}
//
//STDataType STTop(ST* ps)
//{
//	assert(ps);
//	assert(!STEmpty(ps));
//	return ps->a[ps->top - 1];
//}
//
//int STSize(ST* ps)
//{
//	return ps->top;
//}
//
//void STDestroy(ST* ps)
//{
//	assert(ps);
//	free(ps->a);
//	ps->a = NULL;
//	ps->capacity = 0;
//	ps->top = 0;
//}
//
//typedef struct
//{
//	ST Spush;
//	ST Spop;
//} MyQueue;
//
//
//MyQueue* myQueueCreate()
//{
//	MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
//	STInit(&obj->Spush);
//	STInit(&obj->Spop);
//	return obj;
//}
//
//void myQueuePush(MyQueue* obj, int x)
//{
//	STPush(&obj->Spush, x);
//}
//
//int myQueuePeek(MyQueue* obj)
//{
//	if (STEmpty(&obj->Spop))
//	{
//		while (!STEmpty(&obj->Spush))
//		{
//			STPush(&obj->Spop, STTop(&obj->Spush));
//			STPop(&obj->Spush);
//		}
//	}
//	return STTop(&obj->Spop);
//}
//
//int myQueuePop(MyQueue* obj)
//{
//	int front = myQueuePeek(obj);
//	STPop(&obj->Spop);
//	return front;
//}
//
//
//bool myQueueEmpty(MyQueue* obj)
//{
//	return STEmpty(&obj->Spush)
//		&& STEmpty(&obj->Spop);
//}
//
//void myQueueFree(MyQueue* obj)
//{
//	STDestroy(&obj->Spush);
//	STDestroy(&obj->Spop);
//	free(obj);
//}